package pe.com.bbva.ge.vista.vaadin.ui.solicitud;

import java.math.BigInteger;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

import org.springframework.beans.factory.annotation.Autowired;

import pe.com.bbva.ge.domain.configuracion.Atm;
import pe.com.bbva.ge.domain.configuracion.Casetera;
import pe.com.bbva.ge.domain.configuracion.TipoCasetera;
import pe.com.bbva.ge.domain.configuracion.Valor;
import pe.com.bbva.ge.domain.solicitud.Destino;
import pe.com.bbva.ge.domain.solicitud.DetalleCasetera;
import pe.com.bbva.ge.negocio.ConfiguracionNegocio;
import pe.com.bbva.ge.negocio.SolicitudNegocio;
import pe.com.bbva.ge.vista.vaadin.ui.BaseUI;
import pe.com.bbva.ge.vista.vaadin.ui.utileria.ManejadorDenominacion2;
import pe.com.bbva.ge.vista.vaadin.ui.utileria.ManejadorDivisa;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.ui.AbstractComponent;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.GridLayout;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.TextArea;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;

public class SolicitudATMUI extends BaseUI {

	private static final long serialVersionUID = 1L;
	@AutoGenerated
	private VerticalLayout mainLayout;
	@AutoGenerated
	private VerticalLayout verticalLayout_2;
	@AutoGenerated
	private VerticalLayout lytAtm;
	@AutoGenerated
	private HorizontalLayout hlytTotales;
	@AutoGenerated
	private GridLayout lytAtmCasetera;
	@Autowired
	private SolicitudNegocio solicitudNegocio;
	@Autowired
	private ConfiguracionNegocio genericoNegocio;
	private Destino destino;
	private Map<Valor, ManejadorDivisa> mapManejadorDivisa;
	
	public SolicitudATMUI(Destino destino) {
		buildMainLayout();
		setCompositionRoot(mainLayout);
		this.destino=destino;		
	}

	@Override
	public void postConstruccion() {
		mapManejadorDivisa = new HashMap<Valor, ManejadorDivisa>();
		cargarATM();
	}

	public void cargarATM(){
		List<Casetera> lstCasetera=genericoNegocio.obtenerCaseterasPorProveedor(destino.getDestino());		
		Map<Valor, TextField[]> mpTxtTotales = new HashMap<Valor, TextField[]>();		
		Set<TipoCasetera> tipoCaseteras = new TreeSet<TipoCasetera>();		
		Set<Atm> atms = new TreeSet<Atm>();		
		Map<String, Casetera> mCasetera = new HashMap<String, Casetera>();
		String separador = "_";
		for (Casetera casetera : lstCasetera) {
			tipoCaseteras.add(casetera.getTipo());
			atms.add(casetera.getAtm());
			StringBuilder strKey = new StringBuilder();
			strKey.append(casetera.getTipo().getCodigo());
			strKey.append(separador);
			strKey.append(casetera.getAtm().getCodigo());
			mCasetera.put(strKey.toString(), casetera);
		}		
		int tamanhoColumnas = tipoCaseteras.size() + 1;
		int tamanhoFilas = atms.size() + 1;
		
		lytAtmCasetera.setColumns(tamanhoColumnas);
		lytAtmCasetera.setRows(tamanhoFilas);		
		lytAtmCasetera.setSpacing(true);
		
		Iterator<Atm> iAtm = atms.iterator();
		
		int atmCount = 1;
		while (iAtm.hasNext()){
			Atm atm = iAtm.next();
			Label lblNombre = new Label();
			lblNombre.setData(atm.getCodigo());
			lblNombre.setValue(atm.getNombre());
			lytAtmCasetera.addComponent(lblNombre, 0, atmCount);
			atmCount++;
		}		
		int tipoCaseteraCount = 1;		
		Iterator<TipoCasetera> iTipoCasetera = tipoCaseteras.iterator();
		
		while (iTipoCasetera.hasNext()){
			TipoCasetera tipoCasetera = iTipoCasetera.next();
			Label lblCasetera = new Label();
			lblCasetera.setValue(tipoCasetera.getDenominacion().getValor());
			lblCasetera.setData(tipoCasetera);
			lytAtmCasetera.addComponent(lblCasetera, tipoCaseteraCount, 0);
			tipoCaseteraCount++;			
			if(!mpTxtTotales.containsKey(tipoCasetera.getDenominacion().getMoneda())){
				mpTxtTotales.put(tipoCasetera.getDenominacion().getMoneda(),buildTotalMoneda(tipoCasetera.getDenominacion().getMoneda()));
			}
		}
		List<DetalleCasetera> lstDetalleCasetera=solicitudNegocio.obtenerDetalleCasetera(destino);
		for (int i = 1; i < tamanhoColumnas; i++){
			AbstractComponent acCasetera = (AbstractComponent) lytAtmCasetera.getComponent(i, 0);//Casetera
			TipoCasetera tipoCasetera = (TipoCasetera) acCasetera.getData();
			
			if(!mapManejadorDivisa.containsKey(tipoCasetera.getDenominacion().getMoneda())){				
				if(mpTxtTotales.containsKey(tipoCasetera.getDenominacion().getMoneda())){
					TextField[] txt = mpTxtTotales.get(tipoCasetera.getDenominacion().getMoneda());
					mapManejadorDivisa.put(tipoCasetera.getDenominacion().getMoneda(), new ManejadorDivisa(txt[0], txt[1]));
				}
			}
			
			ManejadorDivisa manejadorDivisa = mapManejadorDivisa.get(tipoCasetera.getDenominacion().getMoneda());
//			manejadorDivisa.setModoCrear(true);
			
			String codigoCasetera = tipoCasetera.getCodigo();
			for (int j = 1; j < tamanhoFilas; j++){
				AbstractComponent acAtm = (AbstractComponent) lytAtmCasetera.getComponent(0, j);//Atm
				String codigoAtm = (String) acAtm.getData();
				
				StringBuilder strKey = new StringBuilder();
				strKey.append(codigoCasetera);
				strKey.append(separador);
				strKey.append(codigoAtm);
				
				if(mCasetera.containsKey(strKey.toString())){
					ManejadorDenominacion2 manejadorDenominacion = new ManejadorDenominacion2(tipoCasetera.getDenominacion(), manejadorDivisa);
					manejadorDivisa.agregarManejadorDenominacion(tipoCasetera.getDenominacion(), manejadorDenominacion);
					
					DetalleCasetera detalleCaseteraBuscar = new DetalleCasetera();
					detalleCaseteraBuscar.setCasetera(new Casetera());
					detalleCaseteraBuscar.getCasetera().setAtm(new Atm());
					detalleCaseteraBuscar.getCasetera().getAtm().setCodigo(codigoAtm);
					detalleCaseteraBuscar.getCasetera().setTipo(new TipoCasetera());
					detalleCaseteraBuscar.getCasetera().getTipo().setCodigo(codigoCasetera);
					
					int indice = lstDetalleCasetera.indexOf(detalleCaseteraBuscar);
					DetalleCasetera detalleCasetera = null;
					if(indice >= 0){
						detalleCasetera = lstDetalleCasetera.get(indice);
					}
					
					lytAtmCasetera.addComponent(buildCelda(mCasetera.get(strKey.toString()),manejadorDenominacion, detalleCasetera), i, j);
				}
			}
		}
		
		//pnlAtms.setScrollable(true);
		lytAtm.setSizeUndefined();
	}
	
	private TextField[] buildTotalMoneda(Valor divisa){
		// lblDivisa
		Label lblDivisa = new Label();
		lblDivisa.setImmediate(false);
		lblDivisa.setWidth("-1px");
		lblDivisa.setHeight("-1px");
		lblDivisa.setValue("Total " + divisa.getNombre());
		hlytTotales.addComponent(lblDivisa);
		
		TextField[] textFields = new TextField[2];
		
		// txtTotal
		TextField txtTotal = new TextField();
		txtTotal.setWidth("-1px");
		txtTotal.setHeight("-1px");
		txtTotal.setEnabled(false);
		txtTotal.setInputPrompt("Total " + divisa.getNombre());
		hlytTotales.addComponent(txtTotal);
		
		textFields[0] = txtTotal;
		
		// txtDiferencial
		TextField txtDiferencial = new TextField();
		txtDiferencial.setWidth("-1px");
		txtDiferencial.setHeight("-1px");
		txtDiferencial.setEnabled(false);
		txtDiferencial.setInputPrompt("Restante " + divisa.getNombre());
		hlytTotales.addComponent(txtDiferencial);
		
		textFields[1] = txtDiferencial;
		
		return textFields;
	}
	
	private VerticalLayout buildCelda(Casetera casetera, ManejadorDenominacion2 manejadorDenominacion, DetalleCasetera detalleCasetera){
		// common part: create layout
		VerticalLayout vlytAtmCasetera = new VerticalLayout();
		vlytAtmCasetera.setImmediate(false);
		vlytAtmCasetera.setWidth("170px");
		vlytAtmCasetera.setHeight("68px");
		vlytAtmCasetera.setMargin(false);
		vlytAtmCasetera.setData(casetera);
		
		// hlytAtmCasetera
		HorizontalLayout hlytTotales = buildHlytTotalesCasetera(manejadorDenominacion,detalleCasetera);
		vlytAtmCasetera.addComponent(hlytTotales);
		
		// hlytAtmCasetera1
		HorizontalLayout hlytAtmCasetera1 = buildHlytAtmCasetera1(manejadorDenominacion,detalleCasetera);
		vlytAtmCasetera.addComponent(hlytAtmCasetera1);
		
		// hlytAtmCasetera2
		HorizontalLayout hlytAtmCasetera2 = buildHlytAtmCasetera2();
		vlytAtmCasetera.addComponent(hlytAtmCasetera2);
		vlytAtmCasetera.setExpandRatio(hlytAtmCasetera2, 1.0f);
		
		return vlytAtmCasetera;
	}
	
	private HorizontalLayout buildHlytTotalesCasetera(ManejadorDenominacion2 manejadorDenominacion, DetalleCasetera detalleCasetera) {
		HorizontalLayout hlytTotales = new HorizontalLayout();
		hlytTotales.setImmediate(false);
		hlytTotales.setWidth("160px");
		hlytTotales.setHeight("-1px");
		hlytTotales.setMargin(false);
		
		// txtTotal
		TextField txtTotal = new TextField();
		txtTotal.setImmediate(false);
		txtTotal.setWidth("160px");
		txtTotal.setHeight("-1px");
		txtTotal.setInputPrompt("Total");
		txtTotal.setEnabled(false);
		hlytTotales.addComponent(txtTotal);
		if(detalleCasetera!=null){
			txtTotal.setValue(detalleCasetera.getCantidad());
		}
		manejadorDenominacion.setTxtTotalDenominacion(txtTotal);
		
		return hlytTotales;
	}
	
	private HorizontalLayout buildHlytAtmCasetera1(ManejadorDenominacion2 manejadorDenominacion, DetalleCasetera detalleCasetera) {
		// common part: create layout
		HorizontalLayout hlytAtmCasetera1 = new HorizontalLayout();
		hlytAtmCasetera1.setImmediate(false);
		hlytAtmCasetera1.setWidth("160px");
		hlytAtmCasetera1.setHeight("-1px");
		hlytAtmCasetera1.setMargin(false);
		hlytAtmCasetera1.setData(manejadorDenominacion);
		
		// txtCantidad
		TextField txtCantidad = new TextField();
		txtCantidad.setImmediate(false);
		txtCantidad.setWidth("79px");
		txtCantidad.setHeight("-1px");
		txtCantidad.setInputPrompt("Cantidad");
		//txtCantidad.setSecret(false);
		
		manejadorDenominacion.setTxtCantidad(txtCantidad);
		if(detalleCasetera!=null){
			txtCantidad.setValue(detalleCasetera.getCantidad());
		}
		
		hlytAtmCasetera1.addComponent(txtCantidad);
		// txtImporte
		TextField txtImporte = new TextField();
		txtImporte.setImmediate(false);
		txtImporte.setWidth("79px");
		txtImporte.setHeight("-1px");
		txtImporte.setInputPrompt("Importe");
		//txtImporte.setSecret(false);
		hlytAtmCasetera1.addComponent(txtImporte);
		
		manejadorDenominacion.setTxtImporte(txtImporte);
		
		return hlytAtmCasetera1;
	}
	
	private HorizontalLayout buildHlytAtmCasetera2() {
		// common part: create layout
		HorizontalLayout hlytAtmCasetera2 = new HorizontalLayout();
		hlytAtmCasetera2.setImmediate(false);
		hlytAtmCasetera2.setWidth("160px");
		hlytAtmCasetera2.setHeight("-1px");
		hlytAtmCasetera2.setMargin(false);
		
		// txtObservacion
		TextArea txtObservacion = new TextArea();
		txtObservacion.setImmediate(false);
		txtObservacion.setWidth("158px");
		txtObservacion.setHeight("46px");
		txtObservacion.setInputPrompt("Observación");
		hlytAtmCasetera2.addComponent(txtObservacion);
		//hlytAtmCasetera2.setExpandRatio(txtObservacion, 1.0f);
		
		return hlytAtmCasetera2;
	}
	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("100%");
		mainLayout.setMargin(false);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("100.0%");
		
		// verticalLayout_2
		verticalLayout_2 = buildVerticalLayout_2();
		mainLayout.addComponent(verticalLayout_2);
		
		return mainLayout;
	}

	@AutoGenerated
	private VerticalLayout buildVerticalLayout_2() {
		// common part: create layout
		verticalLayout_2 = new VerticalLayout();
		verticalLayout_2.setImmediate(false);
		verticalLayout_2.setWidth("100.0%");
		verticalLayout_2.setHeight("100.0%");
		verticalLayout_2.setMargin(false);
		
		// lytAtm
		lytAtm = buildLytAtm();
		verticalLayout_2.addComponent(lytAtm);
		
		return verticalLayout_2;
	}

	@AutoGenerated
	private VerticalLayout buildLytAtm() {
		// common part: create layout
		lytAtm = new VerticalLayout();
		lytAtm.setImmediate(false);
		lytAtm.setWidth("100.0%");
		lytAtm.setHeight("100.0%");
		lytAtm.setMargin(false);
		
		// lytAtmCasetera
		lytAtmCasetera = new GridLayout();
		lytAtmCasetera.setImmediate(false);
		lytAtmCasetera.setWidth("-1px");
		lytAtmCasetera.setHeight("-1px");
		lytAtmCasetera.setMargin(false);
		lytAtmCasetera.setSpacing(true);
		lytAtm.addComponent(lytAtmCasetera);
		
		// hlytTotales
		hlytTotales = new HorizontalLayout();
		hlytTotales.setImmediate(false);
		hlytTotales.setWidth("-1px");
		hlytTotales.setHeight("-1px");
		hlytTotales.setMargin(false);
		lytAtm.addComponent(hlytTotales);
		lytAtm.setComponentAlignment(hlytTotales, new Alignment(6));
		
		return lytAtm;
	}

}
